<?php


class RubroController extends Zend_Controller_Action {

    public function init()
    {
        if (X\CheckAccess::Controller()) return;

        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    public function crearAction()
    {
        if (X\CheckAccess::PageAction('Rubro.crear')) return;

        try{
            // obtener los rubros que puedan ser rubros padres (los no terminales)
            $rubros = $this->em->createQueryBuilder()
                    ->select         ('r.codigoRubro')
                    ->addselect      ('r.codigo')
                    ->addselect      ('r.nombreRubro')
                    ->addselect      ('r.egreso')
                    ->from           ('Default_Model_Rubro', 'r')
                    ->where          ('r.terminal = FALSE') 
                    ->orderBy        ('r.codigoRubro', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            //agregar al array un elemento que para la opcion de no tener padre
            $sinPadre=array('codigoRubro'=>0, 'codigo'=> '', 'nombreRubro'=>'(sin padre)');
            array_unshift($rubros,$sinPadre);

            
            // convertir a json
            $this->view->jsonRubros = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($rubros),
                "rows"    => $rubros
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al crear el rubro.';
        }
    }

    public function listarAction()
    {
        if (X\CheckAccess::PageAction('Rubro.listar')) return;

        try{
            // obtener los datos
            $rubros = $this->em->createQueryBuilder()
                    ->select         ('r.codigoRubro')
                    ->addselect      ('r.nombreRubro')
                    ->addselect      ('r.codigo')
                    ->addselect      ('r.terminal')
                    ->addselect      ('r.egreso')
                    ->addselect      ('r.general')
                    ->addselect      ('p.nombreRubro as pname')
                    ->from           ('Default_Model_Rubro', 'r')
                    ->leftJoin       ('r.padre',   'p')
                    ->orderBy        ('r.codigoRubro', 'asc')
                    ->setFirstResult (0)
                    ->setMaxResults  (20)
                    ->getQuery       ()
                    ->execute        ();

            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(r.codigoRubro)')
                    ->from     ('Default_Model_Rubro', 'r')
                    ->getQuery ()
                    ->getSingleScalarResult();

            // convertir a json
            $this->view->jsondata = Zend_Json::encode(Array(
                "success" => true,
                "total"   => $cantidad,
                "rows"    => $rubros
            ));
        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar los rubros.';
        }
    }

    public function editarAction()
    {
        if (X\CheckAccess::PageAction('Rubro.editar')) return;

        try{
            // obtener los parametros
            $id = $this->_request->getQuery('id');

            // obtener el rubro a ser editado
            $rubro = $this->em->find('Default_Model_Rubro', $id);
            $this->view->rubro = $rubro;

            //obtener padre si lo tiene
            $padre = $rubro->getPadre();

            $this->view->originalPadre = ($padre ? $padre->getCodigoRubro() : 0);

            //obtener código concatenado del rubro
             $codigoFull = $rubro->getCodigo();
             $this->view->codigoFull=$codigoFull;

             //enviar cantidad de hijos si el rubro los tiene, para no permitir entonces
             //marcarlo como terminal al editar
             $this->view->cantHijos = count($rubro->getHijos());

            // obtener los rubros que puedan ser rubros padres (los no terminales)
            $rubros = $this->em->createQueryBuilder()
                    ->select         ('r.codigoRubro')
                    ->addselect      ('r.nombreRubro')
                    ->addselect      ('r.codigo')
                    ->addselect      ('r.egreso')
                    ->addselect      ('p.codigoRubro as ppk')
                    ->addselect      ('p.codigo as pcode')
                    ->from           ('Default_Model_Rubro', 'r')
                    ->leftJoin       ('r.padre',   'p')
                    ->where          ('r.terminal = FALSE')
                    ->andWhere       ("r.codigoRubro<>'$id'")
                    ->orderBy        ('r.codigoRubro', 'asc')
                    ->getQuery       ()
                    ->execute        ();

            //quitar de la lista los descendientes del rubro que se modifica, para que
            //el usuario no pueda elegir un descendiente como padre
            foreach(range(0, count($rubros)-1) as $i){
                if($rubros[$i]['ppk'] == $id){
                    unset($rubros[$i]);
                }
            }

            //corregir los indices del array
            $rubros = array_values($rubros);

            //agregar al array un elemento que para la opcion de no tener padre
            $sinPadre=array('codigoRubro'=>0,'nombreRubro'=>'(sin padre)','codigo'=>'','pcode'=>0);
            array_unshift($rubros,$sinPadre);

            // convertir a json
            $this->view->jsonRubros = Zend_Json::encode(Array(
                "success" => true,
                "total"   => count($rubros),
                "rows"    => $rubros
            ));

        }
        catch(Exception $e){
            $this->view->error = 'Error al cargar el departamento.';
        }
    }


    //--------------------------------//
    //              AJAX              //
    //--------------------------------//

    public function ajaxEditarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Rubro.editar')) return;

        try{
            // obtener los parametros
            $pk = $this->_request->getPost('rubroPK');
            $nombre = $this->_request->getPost('nombreRubro');
            $codigo = $this->_request->getPost('codigoNuevo');
            $codigoPadre = $this->_request->getPost('codigoPadre');
            $originalCodigoPadre = $this->_request->getPost('originalPadre');
            $terminal = $this->_request->getPost('checkTerminal');
            $tipo = $this->_request->getPost('tipo');
            $proposito = $this->_request->getPost('proposito');
            $originalFullCodigo = $this->_request->getPost('originalFullCodigo');

            $tipo = ($tipo=='E'     ?  TRUE : FALSE);
            $proposito = ($proposito=='G'     ?  TRUE : FALSE);
            $terminal = ($terminal=='T'     ?  TRUE : FALSE);

            //retrieve del rubro a modificarse
            $rubro = $this->em->find('Default_Model_Rubro', $pk);
            $rubro->setNombre        ($nombre);
     
            //obtener cuentas asociadas al rubro
            $cuentas = $this->em->createQueryBuilder()
            ->select         ('c.codigoCuenta')
            ->addselect      ('r.codigoRubro')
            ->from           ('Default_Model_Cuenta',  'c')
            ->leftJoin       ('c.rubro',               'r')
            ->where          ("r.codigoRubro=$pk")
            ->getQuery       ()
            ->execute        ();

			//Si el rubro que se desea editar ya está asociado a una cuenta, no permitir
			//los siguientes cambios:
			//cambio de padre
            //cambio del proposito (especifico a general, o viceversa)
            //cambio de rubro terminal a no terminal
            if(count($cuentas) > 0){
            	if($rubro->getPadre()->getCodigoRubro() != $codigoPadre){
            		X\Msg::Failure('No puede cambiarse el rubro padre. El rubro ya está asociado a una cuenta');
            		return;
            	}            	
            	elseif($rubro->getGeneral() != $proposito){
            		X\Msg::Failure('No puede cambiarse el propósito. El rubro ya está asociado a una cuenta');
            		return;            		
            	}elseif($rubro->getTerminal() != $terminal){
            		X\Msg::Failure('No puede cambiarse de terminal a no terminal. El rubro ya está asociado a una cuenta');
            		return;            		
            	}
            }

            //guardar el codigo concatenado viejo
            $oldCodigo = $rubro->getCodigo();

            // Si el usuario eligio un padre para el rubro
            if($codigoPadre!=0){
                //retrieve del padre
                $padre = $this->em->find('Default_Model_Rubro', $codigoPadre);
                
                //asignar padre al hijo
                $rubro->setPadre     ($padre);
            }
            //Si el rubro en edicion antes tenia padre y ahora no, quitar rubro padre
            else{
                if($rubro->getPadre())
                    $rubro->unsetPadre();
            }

            $rubro->setCodigo   ($codigo);
            $rubro->setTerminal ($terminal=='T' ?  TRUE : FALSE);
            $rubro->setEgreso   ($tipo);
            $rubro->setGeneral  ($proposito);

            //persist
            $this->em->persist($rubro);

            //flush
            $this->em->flush();

            X\Msg::Success('El rubro se ha editado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al crear el rubro.'.$e->getLine().' '.$e->getMessage());
        }
    }

    
    public function redirAction(){
        echo "hola";
    }


    public function ajaxEliminarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Rubro.eliminar')) return;

        try{
            // obtener los parametros
            $id = $this->_request->getPost('id');

            // obtener el objeto
            $rubro = $this->em->find('Default_Model_Rubro', $id);
            $nombreRubro= $rubro->getNombre();

            // guardar el objeto
            $this->em->remove($rubro);
            $this->em->flush();

            
            X\Msg::Success('El rubro se ha eliminado con éxito.');
        }
        catch(Exception $e){
            X\Msg::Failure('Error al eliminar el rubro.'.$e->getMessage());
        }
    }

    public function ajaxCrearAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Rubro.crear')) return;

        try{
            // obtener los parametros
            $nombre = $this->_request->getPost('nombreRubro'); 
            $codigo = $this->_request->getPost('codigoRubro');
            $codigoPadre = $this->_request->getPost('codigoPadre');
            $terminal = $this->_request->getPost('checkTerminal');
            $tipo = $this->_request->getPost('tipo');
            $proposito = $this->_request->getPost('proposito');

            $tipo = ($tipo=='E'     ?  TRUE : FALSE);
            $proposito = ($proposito=='G'     ?  TRUE : FALSE);

            //obtener el rubro con sus datos actuales
            $newRubro = new Default_Model_Rubro;
            $newRubro->setNombre        ($nombre); 

            // Si el usuario eligio un padre para el rubro
            if($codigoPadre!=0){
                //retrieve del padre
                $padre = $this->em->find('Default_Model_Rubro', $codigoPadre);

                //asignar padre al hijo
                $newRubro->setPadre     ($padre);
            }

            $newRubro->setCodigo        ($codigo);

            $newRubro->setTerminal ($terminal=='T' ?  TRUE : FALSE);
            $newRubro->setEgreso   ($tipo);
            $newRubro->setGeneral  ($proposito);

            //persist-flush
            $this->em->persist($newRubro);
            $this->em->flush();

            X\Msg::Success('El rubro se ha creado con éxito.');

        }
        catch(Exception $e){
            X\Msg::Failure('Error al crear el rubro.'.$e->getLine().' '.$e->getMessage());
        }
    }

    public function ajaxListarAction()
    {
        if (X\CheckAccess::AjaxAction($this, 'Rubro.listar')) return;

        try{
            // obtener los parametros
            $start = $this->_request->getPost("start");
            $limit = $this->_request->getPost("limit");
            $sort  = $this->_request->getPost("sort");
            $dir   = $this->_request->getPost("dir");

            // parametros por defecto
            $sort = isset($sort)? $sort : 'codigoRubro';
            $dir  = isset($dir)?  $dir  : 'asc';

            // prefijo para el sort
            $ordenDiscriminante = ($sort != 'pname'  ?  'r.'.$sort : 'p.nombreRubro'); 

            // obtener los datos
            $rubros = $this->em->createQueryBuilder()
                    ->select         ('r.codigoRubro')
                    ->addselect      ('r.nombreRubro') 
                    ->addselect      ('r.codigo')
                    ->addselect      ('r.terminal')
                    ->addselect      ('r.egreso')
                    ->addselect      ('r.general')
                    ->addselect      ('p.nombreRubro as pname')
                    ->from           ('Default_Model_Rubro', 'r')
                    ->leftJoin       ('r.padre',   'p')
                    ->orderBy        ( $ordenDiscriminante)
                    ->setFirstResult ($start)
                    ->setMaxResults  ($limit)
                    ->getQuery       ()
                    ->execute        ();

            $cantidad = $this->em->createQueryBuilder()
                    ->select   ('count(r.codigoRubro)')
                    ->from     ('Default_Model_Rubro', 'r')
                    ->getQuery ()
                    ->getSingleScalarResult();

            // convertir a json
            echo Zend_Json::encode(Array(
                "success" => true,
                "total"   => $cantidad,
                "rows"    => $rubros
            ));

            
        }
        catch(Exception $e){
            X\Msg::Failure('Error al listar los rubros.');
        }
    }

}


?>